import type { Metadata } from 'next'; import { notFound } from 'next/navigation'; import { requireUser } from '@/lib/auth/session'; import { getCollectionDetail } from '@/lib/account/queries'; import { getDisplay } from '@/lib/account/display'; import { confidenceLabel, fmtDate } from '@/lib/format'; import { PrintButton } from './print-button'; export const metadata: Metadata = { title: 'Insurance schedule', robots: { index: false } }; /** Printable schedule of items with values, sources and confidence — a document, not an appraisal. */ export default async function InsurancePage({ params }: { params: Promise<{ id: string }> }) { const { id } = await params; const u = await requireUser(`/collections/${id}/insurance`); const detail = await getCollectionDetail(u.id, id); if (!detail) notFound(); const d = await getDisplay(); const { collection: c, summary: s, items } = detail; const rows = [...s.items].sort((a, b) => (b.valueUsd ?? 0) - (a.valueUsd ?? 0)); return (

Use your browser's print dialog to save as PDF.

RareIndex · Collection schedule

{c.name}

Prepared for {u.name ?? u.email} · {fmtDate(new Date())} · values in {d.currency}

Total estimated value

{s.valuedCount ? d.money(s.valueUsd) : '—'}

{s.valuedCount}/{s.itemCount} items valued · confidence {confidenceLabel(s.confidence)}

{rows.map((i, idx) => { const src = items.find((x) => x.id === i.id)!; return ( ); })}
# Item Grade / condition Cert / serial Qty Acquired Cost Est. value Basis
{idx + 1}

{i.title}

{i.categorySlug.replace(/_/g, ' ')}{src.source ? ` · from ${src.source}` : ''}

{src.variantLabel ?? (i.grader ? `${i.grader.toUpperCase()} ${i.grade ?? ''}` : src.condition ?? '—')} {[src.certificationNumber, src.serial].filter(Boolean).join(' / ') || '—'} {i.quantity} {i.acquiredAt ?? '—'} {i.costUsd === null ? '—' : d.money(i.costUsd)} {i.valueUsd === null ? 'unavailable' : d.money(i.valueUsd)} {i.valueSource === 'manual' ? 'owner estimate' : i.valueSource === 'none' ? '—' : `RIV · ${confidenceLabel(i.confidence).toLowerCase()}`}
); }